class Request {
    constructor(options = {}) {
        // 请求的根路径
        this.baseUrl = options.baseUrl || ''
        // 请求的 url 地址
        this.url = options.url || ''
        // 请求方式
        this.method = 'GET'
        // 请求的参数对象
        this.data = null
        // header 请求头
        this.header = options.header || {}
        this.beforeRequest = null
        this.afterRequest = null
        this.isLoading = false
        this.isToast = false
        this.message = ''
    }

    get(url, data = {}, options = {}) {
        this.method = 'GET'
        this.url = this.baseUrl + url
        this.data = data
        this.isLoading = options.isLoading || false
        this.isToast = options.isToast || false
        this.message = options.message || ''
        return this._()
    }

    post(url, data = {}, options = {}) {
        this.method = 'POST'
        this.url = this.baseUrl + url
        this.data = data
        this.isLoading = options.isLoading || false
        this.isToast = options.isToast || false
        this.message = options.message || ''
        return this._()
    }

    put(url, data = {}, options = {}) {
        this.method = 'PUT'
        this.url = this.baseUrl + url
        this.data = data
        this.isLoading = options.isLoading || false
        this.isToast = options.isToast || false
        this.message = options.message || ''
        return this._()
    }

    delete(url, data = {}, options = {}) {
        this.method = 'DELETE'
        this.url = this.baseUrl + url
        this.data = data
        this.isLoading = options.isLoading || false
        this.isToast = options.isToast || false
        this.message = options.message || ''
        return this._()
    }

    _() {
        // 清空 header 对象
        this.header = {}
        // 请求之前做一些事
        this.beforeRequest && typeof this.beforeRequest === 'function' && this.beforeRequest(this)
        // 发起请求
        return new Promise((resolve, reject) => {
            let weixin = wx
            // 适配 uniapp
            if ('undefined' !== typeof uni) {
                weixin = uni
            }
            weixin.request({
                url: this.url,
                method: this.method,
                data: this.data,
                header: this.header,
                success: (res) => {
                    resolve(res.data)
                },
                fail: (err) => {
                    reject(err.data)
                },
                complete: (res) => {
                    // 请求完成以后做一些事情
                    this.afterRequest && typeof this.afterRequest === 'function' && this.afterRequest({
                        res:res,
                        isToast:this.isToast,
                        message:this.message,
                    })
                }
            })
        })
    }
}

export const $http = new Request()
